home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / gutil / fullwait.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-02-08  |  1.6 KB  |  75 lines

  1. # include    <useful.h>
  2. # include    <errno.h>
  3. # include    <sccs.h>
  4.  
  5. SCCSID(@(#)fullwait.c    8.3    2/8/85)
  6.  
  7. /*
  8. **  FULLWAIT -- performs a wait(II) primitive for a given child.
  9. **
  10. **    The wait primitive is executed as many times as needed to get
  11. **    termination status for a given child.  The case of an interrupt
  12. **    during the wait is handled.  No other children may die during
  13. **    the wait.  Also, the child must die "normally", that is, as the
  14. **    result of an exit() system call, or from an interrupt.
  15. **
  16. **    Parameters:
  17. **        "child" -- the pid of the child process to wait for,
  18. **            returned from the fork() system call.
  19. **        "name" -- a character string representing the name of
  20. **            the calling routine; printed on syserr's.
  21. **    Returns:
  22. **        The exit parameter of the child process.
  23. */
  24.  
  25. fullwait(child, name)
  26. int    child;
  27. char    *name;
  28. {
  29.     auto int    st;
  30.     register int    i;
  31.     extern int    errno;
  32.     register char    *n;
  33.     register char    *coredump;
  34.  
  35.     n = name;
  36.  
  37.     /* wait for a child to die */
  38.     while ((i = wait(&st)) != child)
  39.     {
  40.         /* it is not the child we want; chew on it a little more */
  41.         if (i != -1)
  42.             syserr("%s: unexpected child: pid %d st 0%o", n, i, st);
  43.  
  44.         /* check for interrupted system call */
  45.         if (errno != EINTR)
  46.         {
  47.             /* wait with no child */
  48.             syserr("%s: no child", n);
  49.         }
  50.         errno = 0;
  51.  
  52.         /* dropped out from signal: reexecute the wait */
  53.     }
  54.  
  55.     /* check termination status */
  56.     i = st & I1MASK;
  57.     if (i > 2)
  58.     {
  59.         /* child collapsed */
  60.         if (i & 0200)
  61.         {
  62.             coredump = " -- core dumped";
  63.             i &= 0177;
  64.         }
  65.         else
  66.         {
  67.             coredump = "";
  68.         }
  69.         syserr("bad status %s: stat %d%s", n, i, coredump);
  70.     }
  71.  
  72.     /* return exit status */
  73.     return (st >> 8);
  74. }
  75.